﻿using System.Security.Principal;

namespace ZuoAlgorithms.Class002;

// 一开始有100个人，每个人都有100元
// 在每一轮都做如下的事情 : 
// 每个人都必须拿出1元钱给除自己以外的其他人，给谁完全随机
// 如果某个人在这一轮的钱数为0，那么他可以不给，但是可以接收
// 发生很多很多轮之后，这100人的社会财富分布很均匀吗？
public class Experiment
{
    public static void ExperimentTest(int n, int t)
    {
        double[] wealth = new double[n];
        Array.Fill(wealth, 100);
        bool[] hasMoney = new bool[n];
        for (int i = 0; i < t; i++)
        {
            Array.Fill(hasMoney, false);
            for (int j = 0; j < n; j++)
            {
                if (wealth[j] > 0)
                {
                    hasMoney[j] = true;
                }
            }
            for (int j = 0; j < n; j++)
            {
                if (hasMoney[j])
                {
                    int other = j;
                    do
                    {
                        Random rand = new Random();
                        other = (int)(rand.Next() * n);
                    } while (other == j);
                    wealth[j]--;
                    wealth[other]++;
                }
            }
        }

    }

    //计算基尼系数
    public static double CalculateGini(double[] wealth)
    {
        double sumOfAbsoluteDifferences = 0;
        double sumOfWealth = 0;
        int n = wealth.Length;
        for (int i = 0; i < n; i++)
        {
            sumOfWealth += wealth[i];
            for (int j = 0; j < n; j++)
            {
                sumOfAbsoluteDifferences += Math.Abs(wealth[i] - wealth[j]);
            }
        }
        return sumOfAbsoluteDifferences / (2 * n * sumOfWealth);
    }
}
